# !/usr/bin/env python
# -*- coding: utf-8 -*-

"""
协同过滤是一种基于用户和物品之间关系的推荐算法。它主要分为两类：基于用户的协同过滤（User-Based Collaborative Filtering，简称UBCF）和基于物品的协同过滤（Item-Based Collaborative Filtering，简称IBCF）。

基于用户的协同过滤：通过计算用户之间的相似度，找到与目标用户相似的用户，再推荐这些相似用户喜欢的物品给目标用户。
基于物品的协同过滤：通过计算物品之间的相似度，找到与目标物品相似的物品，再推荐这些相似物品给喜欢目标物品的用户。
"""

"""
https://zhuanlan.zhihu.com/p/675373153
https://zhuanlan.zhihu.com/p/268401920

协同过滤的特点就是完全没有利用到物品本身或者是用户自身的属性， 仅仅利用了用户与物品的交互信息就可以实现推荐，比较简单高效， 
但这也是它的一个短板所在， 由于无法有效的引入用户年龄， 性别，商品描述，商品分类，当前时间，地点等一系列用户特征、物品特征和上下文特征， 
这就造成了有效信息的遗漏，不能充分利用其它特征数据。
"""


"""
Item-CF和User-CF选择
一、user和item数量分布以及变化频率
 (1) 如果user数量远远大于item数量, 采用Item-CF效果会更好, 因为同一个item对应的打分会比较多, 而且计算量会相对较少
 (2) 如果item数量远远大于user数量, 则采用User-CF效果会更好, 原因同上
 (3) 在实际生产环境中, 有可能因为用户无登陆, 而cookie信息又极不稳定, 导致只能使用item-cf
 (4) 如果用户行为变化频率很慢(比如小说), 用User-CF结果会比较稳定
 (5) 如果用户行为变化频率很快(比如新闻, 音乐, 电影等), 用Item-CF结果会比较稳定

二、相关和惊喜的权衡
 (1) item-based出的更偏相关结果, 出的可能都是看起来比较类似的结果
 (2)user-based出的更有可能有惊喜, 因为看的是人与人的相似性, 推出来的结果可能更有惊喜

三、数据更新频率和时效性要求
 (1) 对于item更新时效性较高的产品, 比如新闻, 就无法直接采用item-based的CF, 因为CF是需要批量计算的, 在计算结果出来之前新的item是无法被推荐出来的,
 导致数据时效性偏低;
 (2) 但是可以采用user-cf, 再记录一个在线的用户item行为对, 就可以根据用户最近类似的用户的行为进行时效性item推荐;
 (3) 对于像影视, 音乐之类的还是可以采用item-cf的
"""
